package com.zzyl.common.utils;

import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.StringUtils;

import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;

/**
 * SQL XML文件管理工具类，负责加载和刷新SQL配置
 */
public class SqlXmlManager {
    // SQL缓存，key为SQL ID，value为SQL语句
    private static final Map<String, String> sqlCache = new HashMap<>();
    // 锁对象，保证刷新操作的线程安全
    private static final ReentrantLock lock = new ReentrantLock();
    // SQL XML文件路径
    private static final String SQL_XML_PATTERN = "classpath*:sql/**/*.xml";
    
    // 静态初始化，加载所有SQL
    static {
        refreshSqlCache();
    }
    
    /**
     * 从缓存中获取SQL
     */
    public static String getSql(String sqlId) {
        return sqlCache.get(sqlId);
    }
    
    /**
     * 刷新SQL缓存，重新加载所有XML文件
     */
    public static void refreshSqlCache() {
        lock.lock();
        try {
            // 清空现有缓存
            sqlCache.clear();
            
            // 加载所有SQL XML文件
            ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            Resource[] resources = resolver.getResources(SQL_XML_PATTERN);
            
            for (Resource resource : resources) {
                loadSqlFromXml(resource);
            }
            
            System.out.println("SQL缓存刷新完成，共加载 " + sqlCache.size() + " 条SQL语句");
        } catch (Exception e) {
            System.err.println("SQL缓存刷新失败: " + e.getMessage());
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
    
    /**
     * 从XML文件加载SQL到缓存
     */
    private static void loadSqlFromXml(Resource resource) throws IOException {
        // 这里简化处理，实际项目中应该使用XML解析器解析
        // 例如使用DOM4J、SAX等解析XML文件中的SQL语句
        String content = FileCopyUtils.copyToString(
            new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8));
        
        // 实际项目中应该解析XML，提取SQL ID和SQL内容
        // 这里仅作示例，不做实际解析
        String fileName = resource.getFilename();
        if (StringUtils.hasText(fileName)) {
            // 这里只是模拟，实际需要根据XML结构解析
            sqlCache.put(fileName, content);
        }
    }
}